home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 142 / Gekkan Dennou Club - 2000.3 Vol. 142 (Japan).7z / Gekkan Dennou Club - 2000.3 Vol. 142 (Japan) (Track 1).bin / imelo / cmscc / f502i.c < prev    next >
C/C++ Source or Header  |  2000-02-06  |  2KB  |  108 lines

  1. /*
  2.     F502用MML変換
  3. */
  4.  
  5. #include    <stdio.h>
  6.  
  7. /*
  8. 入力されるプリプロセス例:
  9.  
  10.  O5C+4O5C+4O5G0HO5G08O5G+4O5A+4O5G02 O5F04O5F04O5E04O5E04O5D04O5D04O5C02
  11.  O5C04O5C04O5G04O5G04O5A04O5A04O5G02 O5F04O5F04O5E04O5E04O5D04O5D04O5C02
  12.  O5G04O5G04O5F04O5F04O5E04O5E04O5D02 O5G04O5G04O5F04O5F04O5E04O5E04O5D02
  13.  O5C04O5C04O5G04O5G04O5A04O5A04O5G02 O5F04O5F04O5E04O5E04O5D04O5D04O5C02
  14.  
  15. 一応、
  16.     On?fl 
  17.      |||+-音長('1','2','3','4','6','8',16='H')
  18.      ||+--#フラグ('+'or'0'なし)
  19.      |+---音名('C','D','E','F','G','A','B'or'R')
  20.      +----オクターブ('3','4','5')
  21. が保証
  22. */
  23.  
  24.  
  25. int    CMSCC_conv23_F502i(src,dest,err)
  26. unsigned char    *src,*dest,*err;
  27. {
  28.     unsigned char    *s,*d,*e,*k;
  29.     unsigned char    oct,    //オクターブ
  30.             name,    //音名
  31.             sharp,    //#
  32.             len;    //音長
  33.     unsigned char    skip,    //スキップコード
  34.             p;    //実際に押すボタン
  35.  
  36.     s=src;
  37.     d=dest;    *d=NULL;
  38.     e=err;
  39.     k=err;        //@@暫定
  40.  
  41.     while( *s ){
  42.         /*    読み込み
  43.         */
  44.         skip=0;
  45.         switch( *s ){
  46.             case 'O':
  47.                 s++;
  48.                 oct=*s++;
  49.                 name=*s++;
  50.                 sharp=*s++;
  51.                 len=*s++;
  52.             break;
  53.             case ' ': case 0x0d: case 0x0a: case '\t':
  54.                 skip=*s++;
  55.             break;
  56.         }
  57.         
  58.         /*    書きだし
  59.         */
  60.         if( skip==0 ){
  61.             switch(name){
  62.                 case 'C':    p='1';    break;
  63.                 case 'D':    p='2';    break;
  64.                 case 'E':    p='3';    break;
  65.                 case 'F':    p='4';    break;
  66.                 case 'G':    p='5';    break;
  67.                 case 'A':    p='6';    break;
  68.                 case 'B':    p='7';    break;
  69.                 case 'R':    p='0';    break;
  70.             }
  71.             if( name!='R' ){
  72.                 switch(oct){
  73.                     case '3':    *d++=p;*d++=p;*d++=p;    break;
  74.                     case '4':    *d++=p;            break;
  75.                     case '5':    *d++=p;*d++=p;        break;
  76.                 }
  77.             }
  78.             else{
  79.                 *d++=p;        //休符を続けて押すと長さが変わるので、要特別扱い
  80.             }
  81.             
  82.             switch(sharp){    //if()でもいいけど気分の問題
  83.                 case '+':    p='@';    *d++=p;        break;
  84.             }
  85.             
  86.             switch(len){
  87.                 case '1':    p='9';    *d++=p;*d++=p;            break;
  88.                 case 'H':    p='9';    *d++=p;                break;
  89.                 case '8':    break;    //デフォルト
  90.                 case '6':    p='8';    *d++=p;                break;
  91.                 case '4':    p='8';    *d++=p;*d++=p;            break;
  92.                 case '3':    p='8';    *d++=p;*d++=p;*d++=p;        break;
  93.                 case '2':    p='8';    *d++=p;*d++=p;*d++=p;*d++=p;    break;
  94.             }
  95.             *d++='>';    //次の文字へマーク
  96.         }
  97.         else{
  98.             //*d++=skip;
  99.         }
  100.     }
  101.     *d++=NULL;
  102.     
  103. }
  104.  
  105.  
  106.  
  107.  
  108.